home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Arsenal Files 8
/
The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO
/
g_quake
/
godelqc5.zip
/
GODEL.QC
< prev
next >
Wrap
Text File
|
1996-09-24
|
28KB
|
951 lines
.float grenadetimer;
.float numholo;//init
.float nextregen;
entity newclient;
//prototypes
float() crandom;
void() GrenadeExplode;
void() BecomeExplosion;
void(string gibname,float dmg) ThrowGib;
void(string gibname,float dmg) ThrowHead;
void(vector p1, vector p2, entity from, float damage) LightningDamage;
void() zombie_stand1;
void() zombie_walk1;
void() zombie_run1;
void(entity attacker,float take) zombie_pain;
void() zombie_paine1;
void() zombie_die;
void() zombie_missile;
void() walkmonster_start_go;
//Make Thrown Ammo,Backpack,Gun pick uppable.
void() SUB_MakePickup = {
self.flags=FL_ITEM;
self.solid=SOLID_TRIGGER;
self.nextthink=time+600;
self.think=SUB_Remove;
};
//Gib a Body into pieces after a while.
void() SUB_Gib = {
ThrowGib("progs/gib1.mdl",10);
ThrowGib("progs/gib1.mdl",10);
ThrowGib("progs/gib2.mdl",10);
ThrowGib("progs/gib3.mdl",10);
ThrowHead("progs/h_player.mdl",10);
};
//Used to toss a weapon, ammo, or armor.
void(float ax) TossBackpack =
{
local entity item;
if (self.flags & FL_OBSERVER) return;
if (self.impulse==55) ax=0;
else if (self.impulse==56) ax=1;
else if (self.impulse==57) ax=32;
if (ax==0) {
if (self.weapon==IT_SUPER_SHOTGUN) ax=3;
if (self.weapon==IT_NAILGUN) ax=4;
if (self.weapon==IT_SUPER_NAILGUN) ax=5;
if (self.weapon==IT_GRENADE_LAUNCHER) ax=6;
if (self.weapon==IT_ROCKET_LAUNCHER) ax=7;
if (self.weapon==IT_LIGHTNING) ax=8;
}
if (ax==1) {
if (self.weapon==IT_SHOTGUN) ax=16;
if (self.weapon==IT_SUPER_SHOTGUN) ax=16;
if (self.weapon==IT_NAILGUN) ax=17;
if (self.weapon==IT_SUPER_NAILGUN) ax=17;
if (self.weapon==IT_GRENADE_LAUNCHER) ax=18;
if (self.weapon==IT_ROCKET_LAUNCHER) ax=18;
if (self.weapon==IT_LIGHTNING) ax=19;
}
if (ax==2) {
if (!(self.ammo_shells+self.ammo_nails+self.ammo_rockets+self.ammo_cells))
return; // nothing in it
item = spawn();
item.owner = self;
item.items = 0;
setmodel (item, "progs/backpack.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
item.ammo_shells = self.ammo_shells;
item.ammo_nails = self.ammo_nails;
item.ammo_rockets = self.ammo_rockets;
item.ammo_cells = self.ammo_cells;
item.classname="backpack";
self.ammo_shells = 0;
self.ammo_nails = 0;
self.ammo_rockets = 0;
self.ammo_cells = 0;
} else if (ax==3) {
if (!(self.items & IT_SUPER_SHOTGUN)) return;
item = spawn();
item.owner = self;
item.items = IT_SUPER_SHOTGUN;
self.items = self.items - IT_SUPER_SHOTGUN;
if (self.weapon==IT_SUPER_SHOTGUN) self.weapon=W_BestWeapon();
setmodel (item, "progs/g_shot.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
if (self.ammo_shells < 10)
item.ammo_shells = self.ammo_shells;
else item.ammo_shells = 10;
self.ammo_shells=self.ammo_shells-item.ammo_shells;
item.classname="weapon_supershotgun";
} else if (ax==4) {
if (!(self.items & IT_NAILGUN)) return;
item = spawn();
item.owner = self;
item.items = IT_NAILGUN;
self.items = self.items - IT_NAILGUN;
if (self.weapon==IT_NAILGUN) self.weapon=W_BestWeapon();
setmodel (item, "progs/g_nail.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
if (self.ammo_nails < 20)
item.ammo_nails = self.ammo_nails;
else item.ammo_nails = 20;
self.ammo_nails=self.ammo_nails-item.ammo_nails;
item.classname="weapon_nailgun";
} else if (ax==5) {
if (!(self.items & IT_SUPER_NAILGUN)) return;
item = spawn();
item.owner = self;
item.items = IT_SUPER_NAILGUN;
self.items = self.items - IT_SUPER_NAILGUN;
if (self.weapon==IT_SUPER_NAILGUN) self.weapon=W_BestWeapon();
setmodel (item, "progs/g_nail2.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
if (self.ammo_nails < 20) item.ammo_nails = self.ammo_nails;
else item.ammo_nails = 20;
self.ammo_nails=self.ammo_nails-item.ammo_nails;
item.classname="weapon_supernailgun";
} else if (ax==6) {
if (!(self.items & IT_GRENADE_LAUNCHER)) return;
item = spawn();
item.owner = self;
item.items = IT_GRENADE_LAUNCHER;
self.items = self.items - IT_GRENADE_LAUNCHER;
if (self.weapon==IT_GRENADE_LAUNCHER) self.weapon=W_BestWeapon();
setmodel (item, "progs/g_rock.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
if (self.ammo_rockets < 10) item.ammo_rockets = self.ammo_rockets;
else item.ammo_rockets = 10;
self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
item.classname="weapon_grenadelauncher";
} else if (ax==7) {
if (!(self.items & IT_ROCKET_LAUNCHER)) return;
item = spawn();
item.owner = self;
item.items = IT_ROCKET_LAUNCHER;
self.items = self.items - IT_ROCKET_LAUNCHER;
if (self.weapon==IT_ROCKET_LAUNCHER) self.weapon=W_BestWeapon();
setmodel (item, "progs/g_rock2.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
if (self.ammo_rockets < 10) item.ammo_rockets = self.ammo_rockets;
else item.ammo_rockets = 10;
self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
item.classname="weapon_rocketlauncher";
} else if (ax==8) {
if (!(self.items & IT_LIGHTNING)) return;
item = spawn();
item.owner = self;
item.items = IT_LIGHTNING;
self.items = self.items - IT_LIGHTNING;
if (self.weapon==IT_LIGHTNING) self.weapon=W_BestWeapon();
setmodel (item, "progs/g_light.mdl");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
if (self.ammo_cells < 10) item.ammo_cells = self.ammo_cells;
else item.ammo_cells = 10;
self.ammo_cells=self.ammo_cells-item.ammo_cells;
item.classname="weapon_lightning";
} else if (ax==16) {
//shells
if (self.ammo_shells==0) return;
item = spawn();
if (self.ammo_shells < 10) item.ammo_shells = self.ammo_shells;
else item.ammo_shells = 10;
item.owner = self;
self.ammo_shells=self.ammo_shells-item.ammo_shells;
setmodel (item, "maps/b_shell1.bsp");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
item.classname = "ammo_shells";
} else if (ax==17) {
//nails
if (self.ammo_nails==0) return;
item = spawn();
if (self.ammo_nails < 20) item.ammo_nails = self.ammo_nails;
else item.ammo_nails = 20;
item.owner = self;
self.ammo_nails=self.ammo_nails-item.ammo_nails;
setmodel (item, "maps/b_nail1.bsp");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
item.classname = "ammo_nails";
} else if (ax==18) {
//rockets
if (self.ammo_rockets==0) return;
item = spawn();
if (self.ammo_rockets < 10) item.ammo_rockets=self.ammo_rockets;
else item.ammo_rockets = 10;
item.owner = self;
self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
setmodel (item, "maps/b_rock1.bsp");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
item.classname = "ammo_rockets";
} else if (ax==19) {
//cells
if (self.ammo_cells==0) return;
item = spawn();
if (self.ammo_cells < 10) item.ammo_cells = self.ammo_cells;
else item.ammo_cells = 10;
item.owner = self;
self.ammo_cells=self.ammo_cells-item.ammo_cells;
setmodel (item, "maps/b_batt1.bsp");
setsize (item, '-16 -16 0', '16 16 56');
item.touch = BackpackTouch;
item.classname = "ammo_cells";
} else if (ax==32) {
if (self.armorvalue<1) return;
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
item = spawn();
item.owner = self;
item.armortype=self.armortype;
item.armorvalue=self.armorvalue;
self.armortype=0;
self.armorvalue=0;
setmodel (item, "progs/armor.mdl");
if (item.armortype==0.3) {
item.skin=0;
self.items=self.items-IT_ARMOR1;
item.items=IT_ARMOR1;
item.classname="item_armor1";
} else if (item.armortype==0.6) {
item.skin=1;
self.items=self.items-IT_ARMOR2;
item.items=IT_ARMOR2;
item.classname="item_armor2";
} else if (item.armortype==0.8) {
item.skin=2;
self.items=self.items-IT_ARMOR3;
item.items=IT_ARMOR3;
item.classname="item_armorInv";
}
setsize (item, '-16 -16 0', '16 16 56');
item.touch = armor_touch;
} else return;
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
W_SetCurrentAmmo(); //Draw new weapon on screen (in hand)
// set missile speed
makevectors (self.v_angle);
if (self.v_angle_x)
item.velocity = v_forward*600 + v_up * 200 +
crandom()*v_right*10 + crandom()*v_up*10;
else
{
item.velocity = aim(self, 10000);
item.velocity = item.velocity * 600;
}
item.origin = self.origin + (item.velocity * 0.0);
item.movetype = MOVETYPE_TOSS;
// so people cant pick it up immediately
item.nextthink = time + 0.25;
item.think = SUB_MakePickup;
};
//Detonate all pipebombs
void() DetPipeBombs =
{
local entity head;
head = find (world,classname,"pipebomb");
while(head)
{
if(head.owner == self)
head.nextthink = time;
head = find (head,classname,"pipebomb");
}
};
void() PipeBombTouch =
{
if (other == self.owner)
return; // don't explode on owner
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM); // bounce sound
if (self.velocity == '0 0 0')
self.avelocity = '0 0 0';
};
void() W_FirePipeBomb =
{
local entity missile, mpuff;
if(self.ammo_rockets < 1) // have to have ammo
return;
self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
self.punchangle_x=-2;
missile = spawn ();
missile.owner = self;
missile.movetype = MOVETYPE_BOUNCE;
missile.solid = SOLID_BBOX;
missile.classname = "pipebomb";
makevectors (self.v_angle);
if (self.v_angle_x) missile.velocity =
v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
else {
missile.velocity = aim(self, 10000);
missile.velocity = missile.velocity * 600;
missile.velocity_z = 200;
}
missile.avelocity = '300 300 300';
missile.angles = vectoangles(missile.velocity);
missile.touch = PipeBombTouch;
missile.think = GrenadeExplode;
setmodel (missile, "progs/grenade.mdl");
setsize (missile, '0 0 0', '0 0 0');
setorigin (missile, self.origin);
//pipe bombs explode after 5 mins by default
missile.nextthink=time+300;
};
// end pipebombs
entity() LightFindTarget = { //this routine based on function by VHOLD
local entity head, selected;
local float dist;
dist = 100000;
selected = world;
head = findradius(self.origin, 100000);
while(head) {
if ((((coop) && (head.classname != "player")) || (!coop)) &&
(((teamplay==1 || teamplay==2 || teamplay==7) &&
(head.team != self.owner.team)) || (teamplay!=1 || teamplay!=7)) &&
((head.health > 1) && (head != self) && (head != self.owner)) &&
(!(head.items & IT_INVISIBILITY ))) {
traceline(self.origin,head.origin,TRUE,self);
if ((trace_fraction==1) && (vlen(head.origin-self.origin) < dist)) {
selected = head;
dist = vlen(head.origin - self.origin);
}
}
head = head.chain;
}
return selected;
};
void(vector p1, vector p2, entity from, float damage) LightningStun =
{
local entity e1, e2;
local vector f;
f = p2 - p1;
normalize (f);
f_x = 0 - f_y;
f_y = f_x;
f_z = 0;
f = f*16;
e1 = e2 = world;
traceline (p1, p2, FALSE, self);
if (trace_ent.takedamage)
{
particle (trace_endpos, '0 0 100', 225, damage*4);
if (trace_ent.th_pain) {
trace_ent.th_pain (trace_ent,damage);
// nightmare mode monsters don't go into pain frames often
if (skill == 3) trace_ent.pain_finished = time + 5;
}
if (self.classname == "player")
{
if (other.classname == "player")
trace_ent.velocity_z = trace_ent.velocity_z + 400;
}
}
e1 = trace_ent;
traceline (p1 + f, p2 + f, FALSE, self);
if (trace_ent != e1 && trace_ent.takedamage)
{
particle (trace_endpos, '0 0 100', 225, damage*4);
if (trace_ent.th_pain) {
trace_ent.th_pain (trace_ent,damage);
// nightmare mode monsters don't go into pain frames often
if (skill == 3) trace_ent.pain_finished = time + 5;
}
}
e2 = trace_ent;
traceline (p1 - f, p2 - f, FALSE, self);
if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage)
{
particle (trace_endpos, '0 0 100', 225, damage*4);
if (trace_ent.th_pain) {
trace_ent.th_pain (trace_ent,damage);
// nightmare mode monsters don't go into pain frames often
if (skill == 3) trace_ent.pain_finished = time + 5;
}
}
};
void() CastMinionLightning =
{
local vector org, dir;
self.effects = self.effects | EF_MUZZLEFLASH;
ai_face ();
org=self.origin;
dir = self.enemy.origin + '0 0 16' - org;
dir = normalize (dir);
traceline (org, self.origin + dir*600, TRUE, self);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LIGHTNING1);
WriteEntity (MSG_BROADCAST, self);
WriteCoord (MSG_BROADCAST, org_x);
WriteCoord (MSG_BROADCAST, org_y);
WriteCoord (MSG_BROADCAST, org_z);
WriteCoord (MSG_BROADCAST, trace_endpos_x);
WriteCoord (MSG_BROADCAST, trace_endpos_y);
WriteCoord (MSG_BROADCAST, trace_endpos_z);
LightningStun (org, trace_endpos, self.owner, 40);
};
//Minion AI
void() MinionThink = {
local vector dir, vtemp;
local string s;
if ((self.owner.flags & FL_HASMINION)==0) {
remove(self);
return;
}
self.enemy = self.owner;
if (self.enemy != world) {
vtemp = self.enemy.origin + '0 0 10';
dir = normalize(vtemp - self.origin + '0 0 25');
self.velocity = dir * 200;
self.angles = vectoangles(self.velocity);
}
self.enemy=LightFindTarget();
if (self.enemy) {
if (self.ammo_cells > 1) {
self.currentammo = self.ammo_cells =self.ammo_cells - 1;
CastMinionLightning();
sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
} else {
self.owner.flags = self.owner.flags - (FL_HASMINION & self.owner.flags);
remove(self);
return;
}
}
self.nextthink = time + 1;
self.think=MinionThink;
};
//Create the minion
void(vector vec) Minion =
{
sound (self, CHAN_WEAPON, "items/damage3.wav", 1, ATTN_NORM);
vec = normalize(vec);
newmis = spawn();
newmis.owner = self;
newmis.classname = "electricminion";
newmis.movetype = MOVETYPE_NOCLIP;
// newmis.movetype = MOVETYPE_FLY;
newmis.solid = SOLID_NOT;
newmis.effects = EF_DIMLIGHT;
newmis.ammo_cells = 40;
newmis.items = IT_LIGHTNING;
setmodel (newmis, "progs/quaddama.mdl");
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
setorigin (newmis, self.origin + '0 0 25');// v_forward*8 + '0 0 16');
newmis.velocity = aim(self, 1000);
newmis.velocity = newmis.velocity * 1;
newmis.angles = vectoangles(newmis.velocity);
newmis.enemy = world;
newmis.nextthink = time + 2;
newmis.think = MinionThink;
};
//Fire the minion with your gun
void() W_FireMinion =
{
if ((self.ammo_cells < 80) || (self.flags & FL_HASMINION)) return;
//maybe add sound for failure?
sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
self.effects = self.effects | EF_MUZZLEFLASH;
self.currentammo = self.ammo_cells = self.ammo_cells - 80;
self.flags = self.flags + FL_HASMINION;
Minion(self.enemy.origin - self.origin);
};
//after a minute, hologram disappears
void() Holothink = {
self.owner.numholo = self.owner.numholo - 1;
sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
remove(self);
};
//Create a hologram
void(vector vec) Hologram = {
if (self.flags & FL_OBSERVER) return;
sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
vec = normalize(vec);
newmis = spawn();
newmis.owner = self;
newmis.classname = "hologram";
newmis.solid = SOLID_NOT;
setmodel (newmis, self.model);
newmis.skin=self.skin;
newmis.frame=self.frame;
newmis.colormap=self.colormap;
newmis.modelindex=self.modelindex;
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
setorigin (newmis, self.origin);
newmis.velocity = aim(self, 1000);
newmis.velocity = newmis.velocity * 1;
newmis.angles = vectoangles(newmis.velocity);
newmis.nextthink = time + 60;
newmis.think = Holothink;
};
//Fire the Hologram
void() W_FireHolo =
{
if ((self.ammo_cells < 12) || (self.numholo > 2)) return;
self.effects = self.effects | EF_MUZZLEFLASH;
self.currentammo = self.ammo_cells = self.ammo_cells - 12;
self.numholo = self.numholo + 1;
Hologram(self.enemy.origin - self.origin);
};
//Become an Observer
void() Observer =
{
self.items = self.items | (IT_INVULNERABILITY + IT_INVISIBILITY);
self.solid = SOLID_NOT;
centerprint(self,"OBSERVER MODE");
self.flags = self.flags | (FL_OBSERVER);
self.flags = self.flags - (self.flags & (FL_HASMINION));
self.movetype=MOVETYPE_NOCLIP;
self.frags=self.frags - 1;
// Detonate Pipe Bombs so person cant use them later
DetPipeBombs();
DropFlagCheck(TRUE);
bprint("\n");
bprint(self.netname);
bprint(" ");
bprint("is now an observer.");
bprint("\n");
setmodel(self,"");
/*
self.flags=self.flags | FL_SWIM | FL_INWATER;
self.watertype=CONTENT_WATER;
self.waterlevel=1;
*/
};
//set the grenade timer based on impulses 53 and 54
void ()SetGrenadeTimer = {
local string s;
local float iv;
if (self.impulse==53){
if (self.grenadetimer==0.5) iv=0;
else iv= -0.5;
if (self.grenadetimer >5) iv = -1;
if (self.grenadetimer >20) iv= -5;
if (self.grenadetimer >60) iv= -15;
if (self.grenadetimer >120) iv= -30;
} else {
iv=0.5;
if (self.grenadetimer>=5) iv=1;
if (self.grenadetimer>=15) iv=5;
if (self.grenadetimer >=60) iv=15;
if (self.grenadetimer >=120) iv=30;
if (self.grenadetimer==300) iv=0;
}
self.grenadetimer=self.grenadetimer+iv;
if (!self.grenadetimer) self.grenadetimer=0.5;
sprint(self,"Grenade Timer: ");
s=ftos(self.grenadetimer);
sprint(self,s);
sprint(self,"\n");
};
//If player has lightning gun and less than 50 cells, the gain a cell
void ()CheckPowerRegen = {
if(self.nextregen <= time){
if((self.items & IT_LIGHTNING) && (self.ammo_cells < 50)){
self.ammo_cells=self.ammo_cells+1;
if (self.weapon==IT_LIGHTNING) self.currentammo=self.ammo_cells;
}
self.nextregen=time+5;
}
};
void() W_PushEnemy = {
local vector source;
local vector push;
source = self.origin + '0 0 16';
makevectors(self.angles);
traceline (source, source + v_forward*128, FALSE, self);
v_forward_z=0;
if (trace_fraction!=1.0)
if (trace_ent.takedamage==DAMAGE_AIM){
//watch out what you move. should this be just players?
if (trace_ent.flags & FL_ONGROUND)
trace_ent.flags=trace_ent.flags-FL_ONGROUND;
sound (self, CHAN_WEAPON, "player/plyrjmp8.wav", 1, ATTN_NORM);
push=(((v_forward*64)-(self.origin + '0 0 -32' - trace_ent.origin))*4);
push_z=push_z+80;
if (self.super_damage_finished > time) push=push*4;
trace_ent.velocity=trace_ent.velocity+push;
}
};
void(vector bolt_org, vector bolt_dir, float spawn_num) LightningBounce =
{
local entity tempent;
local vector old_endpos;
if (spawn_num < 1)
return;
tempent=spawn();
tempent.origin = bolt_org;
setorigin(tempent,bolt_org);
setmodel(tempent,"progs/grenade.mdl");
tempent.v_angle = bolt_dir;
tempent.angles = vectoangles(tempent.v_angle);
traceline (bolt_org, bolt_org + bolt_dir * 600, FALSE, self);
old_endpos = trace_endpos + bolt_dir * 4;
bolt_dir_x = bolt_dir_x * (((0 - 2) * fabs(trace_plane_normal_x)) + 1);
bolt_dir_y = bolt_dir_y * (((0 - 2) * fabs(trace_plane_normal_y)) + 1);
bolt_dir_z = bolt_dir_z * (((0 - 2) * fabs(trace_plane_normal_z)) + 1);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
WriteEntity (MSG_BROADCAST, tempent);
WriteCoord (MSG_BROADCAST, bolt_org_x);
WriteCoord (MSG_BROADCAST, bolt_org_y);
WriteCoord (MSG_BROADCAST, bolt_org_z);
WriteCoord (MSG_BROADCAST, trace_endpos_x);
WriteCoord (MSG_BROADCAST, trace_endpos_y);
WriteCoord (MSG_BROADCAST, trace_endpos_z);
LightningDamage (bolt_org, old_endpos, self, 15*spawn_num);
bolt_dir_x = bolt_dir_x + 0.05 * crandom();
bolt_dir_y = bolt_dir_y + 0.05 * crandom();
bolt_dir_z = bolt_dir_z + 0.05 * crandom();
LightningBounce(old_endpos, bolt_dir, spawn_num - 1);
remove(tempent);
};
void() W_FireSuperLightning =
{
local float cells;
local vector org;
if (self.ammo_cells < 3)
{
self.weaponnum=0;
self.weapon = W_BestWeapon ();
W_SetCurrentAmmo ();
return;
}
// explode if under water
if (self.waterlevel > 1)
{
cells=self.ammo_cells;
self.ammo_cells = 0;
T_RadiusDamage (self, self, 35*cells, world);
W_SetCurrentAmmo ();
return;
}
if (self.t_width < time)
{
sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
self.t_width = time + 0.6;
}
self.punchangle_x = -2;
self.currentammo = self.ammo_cells = self.ammo_cells - 3;
org=self.origin+'0 0 16';
traceline(org,org+v_forward*600,TRUE,self);
makevectors(self.v_angle);
self.attack_finished=time + 2;
LightningBounce(org, v_forward, 3);
};
void() W_Remember =
{
self.pos1 = self.origin;
self.pos2 = self.angles;
sound (self, CHAN_WEAPON, "misc/basekey.wav", 1, ATTN_NORM);
sprint (self, "Location Stored\n");
};
// void(vector org) spawn_tfog;
// void() tdeath_touch;
void(vector org, entity death_owner) spawn_tdeath;
void() W_Teleport =
{
if (self.ammo_cells < 10)
{
sprint(self,"Need 10 cells to teleport.\n");
return;
}
if (teamplay == 7)
{
sprint(self,"Teleporting disabled in Capture The Flag.\n");
return;
}
if (!(self.pos1 == '0 0 0'))
{
self.currentammo = self.ammo_cells = self.ammo_cells - 10;
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_TELEPORT);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
sound (self, CHAN_WEAPON, "misc/r_tele4.wav", 1, ATTN_NORM);
spawn_tdeath(self.pos1, self);
self.origin = self.pos1;
self.angles = self.pos2;
self.fixangle = 1;
sound (self, CHAN_WEAPON, "misc/r_tele3.wav", 1, ATTN_NORM);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_TELEPORT);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
}
else sprint(self,"No location stored.\n");
};
void () W_TripExplode =
{
self.owner = self.dmg_inflictor;
T_RadiusDamage (self, self.owner, 199, self);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
BecomeExplosion ();
};
void() W_TripActivate =
{
local vector org;
local vector des;
local entity found;
local entity tempent;
local float min_dist;
org = self.origin;
des = self.pos1;
traceline(org, des, FALSE, self);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
WriteEntity (MSG_BROADCAST, self);
WriteCoord (MSG_BROADCAST, org_x);
WriteCoord (MSG_BROADCAST, org_y);
WriteCoord (MSG_BROADCAST, org_z);
WriteCoord (MSG_BROADCAST, trace_endpos_x);
WriteCoord (MSG_BROADCAST, trace_endpos_y);
WriteCoord (MSG_BROADCAST, trace_endpos_z);
self.health = self.health - 1;
if (trace_endpos != des && self.health > 3)
self.health = 1;
if (self.health == 1)
sound (self, CHAN_WEAPON, "misc/talk.wav", 1, ATTN_NORM);
if (self.health <= 0)
{
self.think = W_TripExplode;
self.nextthink = time;
}
else
{
self.think = W_TripActivate;
self.nextthink = time + 0.15;
}
};
void() W_TripWait =
{
local entity oldself;
if(other.health) {
remove(self);
return;
}
self.owner.attack_finished = time + 1;
self.owner.currentammo=self.owner.ammo_rockets = self.owner.ammo_rockets - 5;
self.owner.items=self.owner.items-(self.owner.items & IT_ROCKET_LAUNCHER);
oldself=self;
self=self.owner;
self.weapon=W_BestWeapon();
W_SetCurrentAmmo();
self=oldself;
setmodel(self,"progs/missile.mdl");
self.angles = self.velocity;
self.velocity = '0 0 0';
self.movetype = MOVETYPE_NONE;
setsize (self, '0 0 0', '0 0 0');
sound (self, CHAN_WEAPON, "misc/basekey.wav", 1, ATTN_NORM);
self.dmg_inflictor = self.owner;
traceline (self.origin, self.origin - self.angles*6000, FALSE, self);
self.pos1 = trace_endpos;
self.health = 1200 ; // 3mins
self.owner = self;
self.think = W_TripActivate;
self.nextthink = time + 1.5;
};
void() W_FireTripBomb =
{
local vector dir;
if (self.ammo_rockets < 5)
{
sprint (self, "Need 5 rockets to place tripbomb\n");
return;
}
dir = aim(self,1000);
newmis = spawn ();
newmis.owner = self;
newmis.movetype = MOVETYPE_FLYMISSILE;
newmis.solid = SOLID_BBOX;
newmis.angles = vectoangles(dir);
newmis.touch = W_TripWait;
newmis.classname="tripbomb";
newmis.takedamage = DAMAGE_NO;
newmis.think = SUB_Remove;
newmis.nextthink = time + 0.05;
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
setorigin (newmis, self.origin);
newmis.velocity = dir * 5000;
};
void(entity targ,entity inflictor, float vel) DamageGib = {
local entity oldself;
local float rnum;
rnum = random();
if ((vel < 10) || (inflictor.weapon == IT_LIGHTNING)) return;
oldself=self;
self=targ;
if(vel < 50) ThrowGib("progs/gib1.mdl",-2 * vel);
else if(vel < 90) {
if(rnum < 0.5){
ThrowGib("progs/gib1.mdl",-2 * vel);
ThrowGib("progs/gib1.mdl",-2 * vel);
} else {
ThrowGib("progs/gib3.mdl",-2 * vel);
}
} else if(vel < 130) {
ThrowGib("progs/gib1.mdl",-2 * vel);
ThrowGib("progs/gib3.mdl",-2 * vel);
} else if(vel < 170) {
ThrowGib("progs/gib3.mdl",-2 * vel);
if(rnum < 0.5){
ThrowGib("progs/gib1.mdl",-2 * vel);
ThrowGib("progs/gib1.mdl",-2 * vel);
} else {
ThrowGib("progs/gib3.mdl",-2 * vel);
}
} else if(vel < 210) {
ThrowGib("progs/gib3.mdl",-2 * vel);
ThrowGib("progs/gib3.mdl",-2 * vel);
ThrowGib("progs/gib1.mdl",-2 * vel);
} else {
ThrowGib("progs/gib3.mdl",-2 * vel);
ThrowGib("progs/gib3.mdl",-2 * vel);
ThrowGib("progs/gib1.mdl",-2 * vel);
ThrowGib("progs/gib1.mdl",-2 * vel);
}
self=oldself;
};
void() SetAliases = {
if(newclient==world) return;
stuffcmd(newclient,"alias INC_SKIN impulse 200\n");
stuffcmd(newclient,"alias DEC_SKIN impulse 201\n");
stuffcmd(newclient,"alias OBSERVER impulse 210\n");
stuffcmd(newclient,"alias UNPLACE impulse 17\n");
stuffcmd(newclient,"alias DROP_FLAG impulse 18\n");
stuffcmd(newclient,"alias CYCLE_TEAMPLAY impulse 19\n");
stuffcmd(newclient,"alias DETONATE impulse 52\n");
stuffcmd(newclient,"alias DEC_GRENADE_TIMER impulse 53\n");
stuffcmd(newclient,"alias INC_GRENADE_TIMER impulse 54\n");
stuffcmd(newclient,"alias TOSS_WEAPON impulse 55\n");
stuffcmd(newclient,"alias TOSS_AMMO impulse 56\n");
stuffcmd(newclient,"alias TOSS_ARMOR impulse 57\n");
stuffcmd(newclient,"alias HOLO impulse 58\n");
newclient=world;
};
void(entity targ,entity attacker) CreateZombie = {
local entity ent;
setmodel(targ,"progs/gib3.mdl");
ent=self;
self=spawn();
setorigin(self,targ.origin);
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_STEP;
setmodel (self, "progs/zombie.mdl");
setsize (self, '-16 -16 -24', '16 16 40');
self.friend=attacker;
self.health = 65;
self.classname = "monster_zombie";
self.th_stand = zombie_stand1;
self.th_walk = zombie_walk1;
self.th_run = zombie_run1;
self.th_pain = zombie_pain;
self.th_die = zombie_die;
self.th_missile = zombie_missile;
walkmonster_start_go();
T_Damage(self,ent,ent,60);
self=ent;
};